/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import java.util.ArrayList;
import java.util.List;
import util.Observable;
import util.Observeur;

/**
 *
 * @author benoit
 */
public class Date implements Observable, Comparable<Date> {
    private int heure;
    private int minute;
    private int seconde;
    private List<Observeur> observeurs;

    public Date() {
        heure = 0;
        minute = 0;
        seconde = 0;
        observeurs = new ArrayList<Observeur>();
    }
    
    public Date(int heure, int minute, int seconde) {
        if( ! ( 
                (heure>=0 && heure <=23)
                || (minute>=0 && minute <=59) 
                || (seconde>=0 && seconde <=59)
                )){
            throw new IllegalArgumentException("\nheure>=0 et <24\nminute>=0 et <60\nseconde>=0 et <60\n");
        }
        this.heure = heure;
        this.minute = minute;
        this.seconde = seconde;
        observeurs = new ArrayList<Observeur>();
    }

    public void reset() {
        heure = 0;
        minute = 0;
        seconde = 0;
        notifierObserveurs();
    }
    
    /**
     * incrémente l'heure de 1 seconde
     * retourne faux si et seulement si l'horloge a fait un tour entier (de 00:00:00 à 23:59:59)
     * 
     * @return 
     */
    public boolean incrementer() {
        seconde++;
        
        if( (seconde%=60) == 0 ) {
            minute++;
            if( (minute%=60) == 0 ) {
                heure++;
                if( heure == 24 ) {
                    heure = 0;
                    notifierObserveurs();
                    return false;
                }
            }
        }
        notifierObserveurs();
        return true;
    }

    @Override
    public String toString() {
        /* Informations concernant le formatage des nombres => http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#dnint */
        return String.format("%02d",heure) + ":" + String.format("%02d",minute) + ":" + String.format("%02d",seconde);
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Date other = (Date) obj;
        if (this.heure != other.heure) {
            return false;
        }
        if (this.minute != other.minute) {
            return false;
        }
        if (this.seconde != other.seconde) {
            return false;
        }
        return true;
    }


    public int getHeure() {
        return heure;
    }

    public int getMinute() {
        return minute;
    }

    public int getSeconde() {
        return seconde;
    }

    @Override
    public void ajouterObserveur(Observeur o) {
        if(o==null) {
            throw new IllegalArgumentException("Null pointer argument 1");
        }
        observeurs.add(o);
    }

    @Override
    public void supprimerObserveur(Observeur o) {
        observeurs.remove(o);
    }

    @Override
    public void notifierObserveurs() {
        for(Observeur o : observeurs) {
            o.update();
        }
    }

    @Override
    public int compareTo(Date o) {
        if(o==null) {
            throw new IllegalArgumentException("Null pointer argument 1");
        }
        if(o.getClass()!=this.getClass()) {
            throw new IllegalArgumentException("Ce n'est pas argument de type Date");
        }
        Date d = (Date) o;
        if(this.heure>d.getHeure()) {
            return 1;
        } else if(this.heure<d.getHeure()) {
            return -1;
        } else {
            if(this.minute>d.getMinute()) {
                return 1;
            } else if(this.minute<d.getMinute()) {
                return -1;
            } else {
                if(this.seconde>d.getSeconde()) {
                    return 1;
                } else if(this.seconde<d.getSeconde()) {
                    return -1;
                } else {
                    return 0;
                }
            }
        }
    }
}
